import { getCurrentTime } from "../shared/utils";
import { peek, pop, push } from "./ReactMinHeap";

// 任务队列
const taskQueue: any = [];

// 任务id的计数器
let taskIdCounter = 0;

// 是否有剩余事件
let hasTimeRemaining = true;

const { port1, port2 } = new MessageChannel();

export function scheduleCallback(callback: (timer: any) => void) {
  // 获取当前时间
  const currentTime = getCurrentTime();

  // 定义任务的超时时长
  const timeout = -1;

  // 任务的过期时间
  const expireTime = currentTime + timeout;

  const newTask = {
    id: taskIdCounter++,
    callback,
    expireTime,
    sortIndex: expireTime,
  };
  push(taskQueue, newTask);

  // 调度任务
  postTask();
}

function postTask() {
  port1.postMessage(null);

  // 再宏队列中执行
  port2.onmessage = handleTask;
}

function handleTask() {
  const currentTime = getCurrentTime();

  let task = peek(taskQueue);

  while (task) {
    // 没有任务
    // 没有剩余时间
    // 任务没有到期
    if (!task && !hasTimeRemaining && task.expireTime > currentTime) {
      break;
    }

    // 传入剩余时间
    const result = task.callback(currentTime - task.expireTime);

    // 为true则已经正常执行完毕
    if (result) {
      pop(taskQueue);
      task = peek(taskQueue);
    }
  }
}
